package controlador;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.joda.time.DateTime;
import org.joda.time.LocalDate;

import com.csvreader.CsvReader;
import com.csvreader.CsvWriter;

import dominio.Agencia;
import dominio.Empresa;
import dominio.Persona;
import dominio.DAO.AgenciaDAO;
import dominio.DAO.BaseDatosMock;
import dominio.DAO.EmpresaDAO;
import dominio.DAO.PersonaDAO;

public class ClienteControlador {
    
    // private ClienteDAO clienteDAO = new ClienteDAO();
    private PersonaDAO personaDAO = new PersonaDAO();
    private EmpresaDAO empresaDAO = new EmpresaDAO();
    private AgenciaDAO agenciaDAO = new AgenciaDAO();
    	
	/* METODOS REFERENTES A EMPRESA */
	
	public Empresa registrarEmpresa(String codigo, String razonSocial, String identificacion, String telefono, String correo, String direccion, 
			String ciudad, String estado, String pais, String nombreContacto, String metodoPago, String convenio){
		Empresa empresa = new Empresa(codigo, razonSocial, identificacion, telefono, correo, direccion, 
				ciudad, estado, pais, nombreContacto, metodoPago, convenio);
		empresaDAO.crearEmpresa(empresa);
		return empresa;
	}
	
	public void modificarEmpresa(String codigo, String razonSocial, String identificacion, String telefono, String correo, String direccion, 
    		String ciudad, String estado, String pais, String nombreContacto, String metodoPago, String convenio){
		empresaDAO.modificarEmpresa(codigo, razonSocial, identificacion, telefono, correo, 
				direccion, ciudad, estado, pais, nombreContacto, metodoPago, convenio);
	}
	
	public void exportarEmpresas(String nombreArchivo){
		
		String outputFile = nombreArchivo;
		
		// before we open the file check to see if it already exists
		boolean alreadyExists = new File(outputFile).exists();
			
		try {
			// use FileWriter constructor that specifies open for appending
			CsvWriter csvOutput = new CsvWriter(new FileWriter(outputFile, true), ',');
			
			// if the file didn't already exist then we need to write out the header line
			if (!alreadyExists){
				csvOutput.write("Codigo");
				csvOutput.write("Razon Social");
				csvOutput.write("Identificacion");
				csvOutput.write("Telefono");
				csvOutput.write("Correo");
				csvOutput.write("Direccion");
				csvOutput.write("Ciudad");
				csvOutput.write("Estado");
				csvOutput.write("Pais");
				csvOutput.write("Nombre Contacto");
				csvOutput.write("Metodo de Pago");
				csvOutput.write("Convenio");
				csvOutput.endRecord();
			}
			// else assume that the file already has the correct header line
			
			List<Empresa> empresas = new ArrayList<Empresa>();
			empresas = devolverListaEmpresas();
			for(Empresa empresa : empresas){
				// write out a few records
				csvOutput.write(empresa.getCodigo());
				csvOutput.write(empresa.getRazonSocial());
				csvOutput.write(empresa.getIdentificacion());
				csvOutput.write(empresa.getTelefono());
				csvOutput.write(empresa.getCorreo());
				csvOutput.write(empresa.getDireccion());
				csvOutput.write(empresa.getCiudad());
				csvOutput.write(empresa.getEstado());
				csvOutput.write(empresa.getPais());
				csvOutput.write(empresa.getNombreContacto());
				csvOutput.write(empresa.getMetodoPago());
				csvOutput.write(empresa.getConvenio());
				csvOutput.endRecord();
			}
			
			csvOutput.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void importarEmpresas(String nombreArchivo){
		
		try {
			
			CsvReader empresas = new CsvReader(nombreArchivo);
		
			empresas.readHeaders();

			while (empresas.readRecord()){
			
				String codigo = empresas.get(0);				
				String razonSocial = empresas.get(1);
				String identificacion = empresas.get(2);
				String telefono = empresas.get(3);
				String correo = empresas.get(4);
				String direccion = empresas.get(5);
				String ciudad = empresas.get(6);
				String estado = empresas.get(7);
				String pais = empresas.get(8);
				String nombreContacto = empresas.get(9);		
				String metodoPago = empresas.get(10);
				String convenio = empresas.get(11);
				
				// perform program logic here
				registrarEmpresa(codigo, razonSocial, identificacion, telefono, correo, direccion, 
						ciudad, estado, pais, nombreContacto, metodoPago, convenio);
			}
	
			empresas.close();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public ArrayList<Empresa> devolverListaBusquedaEmpresasPorRazonSocial(String razonSocial){
		return empresaDAO.devolverListaBusquedaEmpresasPorRazonSocial(razonSocial);
    }	
	
	public void eliminarEmpresa(String codigo){
		empresaDAO.eliminarEmpresa(codigo);
	}
	
	public Empresa obtenerEmpresaPorCodigo(String codigo){
		return empresaDAO.obtenerEmpresaPorCodigo(codigo);
	}
		
	public int devolverCantidadEmpresas(){
        return empresaDAO.devolverCantidadEmpresas();
    }
    
    public List<Empresa> devolverListaEmpresas(){
        return empresaDAO.devolverEmpresas();
    }
    
    public void limpiaListaEmpresa() {
    	empresaDAO.limpiaListaEmpresa();
    }
    
	/* METODOS REFERENTES A AGENCIA */
	
	public Agencia registrarAgencia(String codigo, String nombreAgencia, String identificacion, String telefono, String correo, 
			String direccion, String ciudad, String estado, String pais, String nombreContacto){
		Agencia agencia = new Agencia(codigo, nombreAgencia, identificacion, telefono, correo, 
				direccion, ciudad, estado, pais, nombreContacto);
		agenciaDAO.crearAgencia(agencia);
		return agencia;
	}
	
	public void modificarAgencia(String codigo, String nombreAgencia, String identificacion, String telefono, String correo, 
			String direccion, String ciudad, String estado, String pais, String nombreContacto){		
		agenciaDAO.modificarAgencia(codigo, nombreAgencia, identificacion, telefono, 
				correo, direccion, ciudad, estado, pais, nombreContacto);
	}	
	
	public void exportarAgencias(String nombreArchivo){
		
		String outputFile = nombreArchivo;
		
		// before we open the file check to see if it already exists
		boolean alreadyExists = new File(outputFile).exists();
			
		try {
			// use FileWriter constructor that specifies open for appending
			CsvWriter csvOutput = new CsvWriter(new FileWriter(outputFile, true), ',');
			
			// if the file didn't already exist then we need to write out the header line
			if (!alreadyExists){
				csvOutput.write("Codigo");
				csvOutput.write("Nombre Agencia");
				csvOutput.write("Identificacion");
				csvOutput.write("Telefono");
				csvOutput.write("Correo");
				csvOutput.write("Direccion");
				csvOutput.write("Ciudad");
				csvOutput.write("Estado");
				csvOutput.write("Pais");
				csvOutput.write("Nombre Contacto");
				csvOutput.endRecord();
			}
			// else assume that the file already has the correct header line
			
			List<Agencia> agencias = new ArrayList<Agencia>();
			agencias = devolverListaAgencias();
			for(Agencia agencia : agencias){
				// write out a few records
				csvOutput.write(agencia.getCodigo());
				csvOutput.write(agencia.getNombreAgencia());
				csvOutput.write(agencia.getIdentificacion());
				csvOutput.write(agencia.getTelefono());
				csvOutput.write(agencia.getCorreo());
				csvOutput.write(agencia.getDireccion());
				csvOutput.write(agencia.getCiudad());
				csvOutput.write(agencia.getEstado());
				csvOutput.write(agencia.getPais());
				csvOutput.write(agencia.getNombreContacto());
				csvOutput.endRecord();
			}
			
			csvOutput.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}	
	
	public void importarAgencias(String nombreArchivo){
		
		try {
			
			CsvReader agencias = new CsvReader(nombreArchivo);
		
			agencias.readHeaders();

			while (agencias.readRecord()){
			
				String codigo = agencias.get(0);				
				String nombreAgencia = agencias.get(1);
				String identificacion = agencias.get(2);
				String telefono = agencias.get(3);
				String correo = agencias.get(4);
				String direccion = agencias.get(5);
				String ciudad = agencias.get(6);
				String estado = agencias.get(7);
				String pais = agencias.get(8);
				String nombreContacto = agencias.get(9);
				
				// perform program logic here
				registrarAgencia(codigo, nombreAgencia, identificacion, telefono, 
						correo, direccion, ciudad, estado, pais, nombreContacto);
			}
	
			agencias.close();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}	
	
	public ArrayList<Agencia> devolverListaBusquedaAgenciasPorNombre(String nombre){	
		return agenciaDAO.devolverListaBusquedaAgenciasPorNombre(nombre);
    }

	public void eliminarAgencia(String codigo){
		agenciaDAO.eliminarAgencia(codigo);
	}
	
	public Agencia obtenerAgenciaPorCodigo(String codigo){
		return agenciaDAO.obtenerAgenciaPorCodigo(codigo);
	}
	
	public int devolverCantidadAgencias(){
        return agenciaDAO.devolverCantidadAgencias();
    }
    
    public List<Agencia> devolverListaAgencias(){
        return agenciaDAO.devolverAgencias();
    }
    
    public void limpiaListaAgencia() {
    	agenciaDAO.limpiaListaAgencia();
    }
    
    /* METODOS REFERENTES A PERSONA */
	
	public Persona registrarPersona(String codigo, String nombres, String apellidos, String pasaporte, String telefono, String sexo, String correo, 
    		String direccion, String ciudad, String estado, String pais, LocalDate fechaNacimiento, String comentarios){
		Persona persona = new Persona(codigo, nombres, apellidos, pasaporte, telefono, sexo, correo, 
	    		direccion, ciudad, estado, pais, fechaNacimiento, comentarios);
		personaDAO.crearPersona(persona);
		return persona;
	}
	
	public void modificarPersona(String codigo, String nombres, String apellidos, String pasaporte, String telefono, String sexo, String correo, 
    		String direccion, String ciudad, String estado, String pais, LocalDate fechaNacimiento, String comentarios){
		personaDAO.modificarPersona(codigo, nombres, apellidos, pasaporte, telefono, sexo, correo, 
				direccion, ciudad, estado, pais, fechaNacimiento, comentarios);
	}	
	
	public void exportarPersonas(String nombreArchivo){
		
		String outputFile = nombreArchivo;
		
		// before we open the file check to see if it already exists
		boolean alreadyExists = new File(outputFile).exists();
			
		try {
			// use FileWriter constructor that specifies open for appending
			CsvWriter csvOutput = new CsvWriter(new FileWriter(outputFile, true), ',');
			
			// if the file didn't already exist then we need to write out the header line
			if (!alreadyExists){
				csvOutput.write("Codigo");
				csvOutput.write("Nombres");
				csvOutput.write("Apellidos");
				csvOutput.write("Pasaporte");
				csvOutput.write("Telefono");
				csvOutput.write("Sexo");
				csvOutput.write("Correo");
				csvOutput.write("Direccion");
				csvOutput.write("Ciudad");
				csvOutput.write("Estado");
				csvOutput.write("Pais");
				csvOutput.write("Comentarios");
				csvOutput.endRecord();
			}
			// else assume that the file already has the correct header line
			
			List<Persona> personas = new ArrayList<Persona>();
			personas = devolverListaPersonas();
			for(Persona persona : personas){
				// write out a few records
				csvOutput.write(persona.getCodigo());
				csvOutput.write(persona.getNombres());
				csvOutput.write(persona.getApellidos());
				csvOutput.write(persona.getPasaporte());
				csvOutput.write(persona.getTelefono());
				csvOutput.write(persona.getSexo());
				csvOutput.write(persona.getCorreo());
				csvOutput.write(persona.getDireccion());
				csvOutput.write(persona.getCiudad());
				csvOutput.write(persona.getEstado());
				csvOutput.write(persona.getPais());
				csvOutput.write(persona.getComentarios());
				csvOutput.endRecord();
			}
			
			csvOutput.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}	
	
	public void importarPersonas(String nombreArchivo){
		
		try {
			
			LocalDate fechaNacimiento = new DateTime(1989, 04, 1, 0, 0, 0, 0).toLocalDate();
			
			CsvReader personas = new CsvReader(nombreArchivo);
		
			personas.readHeaders();

			while (personas.readRecord()){
			
				String codigo = personas.get(0);				
				String nombres = personas.get(1);
				String apellidos = personas.get(2);
				String pasaporte = personas.get(3);
				String telefono = personas.get(4);
				String sexo = personas.get(5);
				String correo = personas.get(6);
				String direccion = personas.get(7);
				String ciudad = personas.get(8);
				String estado = personas.get(9);
				String pais = personas.get(10);
				String comentarios = personas.get(11);
				
				// perform program logic here
				registrarPersona(codigo, nombres, apellidos, pasaporte, telefono, sexo, 
						correo, direccion, ciudad, estado, pais, fechaNacimiento, comentarios);
			}
	
			personas.close();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public List<Persona> devolverListaBusquedaPersonasPorApellidos(String apellidos){	
		return personaDAO.devolverListaBusquedaPersonasPorApellidos(apellidos);
    }
	
	public void eliminarPersona(String codigo){
		personaDAO.eliminarPersona(codigo);
	}
	
	public Persona obtenerPersonaPorCodigo(String codigo){
		return personaDAO.obtenerPersonaPorCodigo(codigo);
	}
	
	public int devolverCantidadPersonas(){
        return personaDAO.devolverCantidadPersonas();
    }
    
    public List<Persona> devolverListaPersonas(){
        return personaDAO.devolverPersonas();
    }
    
    public void limpiaListaPersona() {
    	personaDAO.limpiaListaPersona();
    }
    
    public void setBaseDatosMock(BaseDatosMock bdMock) {
        // this.clienteDAO.setBaseDatosMock(bdMock);
        this.personaDAO.setBaseDatosMock(bdMock);
        this.agenciaDAO.setBaseDatosMock(bdMock);
        this.empresaDAO.setBaseDatosMock(bdMock);
    }
    
    
	/* VALIDACIONES */
	
//	public boolean validarNombres(String nombres){
//		if(((nombres.trim()).isEmpty())){
//			return false;		
//		}else{
//			Pattern patron = Pattern.compile("^[a-zA-Z ]*$");
//			Matcher match = patron.matcher(nombres);
//			return match.matches();	
//		}
//	}
//	
//	public boolean validarApellidos(String apellidos){
//		if(((apellidos.trim()).isEmpty())){
//			return false;		
//		}else{
//			Pattern patron = Pattern.compile("^[a-zA-Z ]*$");
//			Matcher match = patron.matcher(apellidos);
//			return match.matches();
//		}
//	}
//	
//	public boolean validarRazonSocial(String razonSocial){
//		if(((razonSocial.trim()).isEmpty())){
//			return false;	
//		}else{
//			Pattern patron = Pattern.compile("^[a-zA-Z0-9 ]*$");
//			Matcher match = patron.matcher(razonSocial);
//			return match.matches();
//		}
//	}
//	
//	public boolean validarPasaporte(String pasaporte){
//		Pattern patron = Pattern.compile("^[A-Z0-9]{15}$");
//		Matcher match = patron.matcher(pasaporte);
//		return match.matches();
//	}
//	
//	public boolean validarTelefono(String telefono){
//		Pattern patron = Pattern.compile("[0-9 ]*$");
//		Matcher match = patron.matcher(telefono);
//		return match.matches();
//	}
//	
//	public boolean validarSexo(String sexo){
//		Pattern patron = Pattern.compile("[M || F]{1}*$");
//		Matcher match = patron.matcher(sexo);
//		return match.matches();
//	}
//	
//	public boolean validarCorreo(String correo){ 		
//		Pattern patron = Pattern.compile("^[a-zA-Z0-9_-]{2,15}@[a-zA-Z0-9_-]{2,15}.[a-zA-Z]{2,4}(.[a-zA-Z]{2,4})?$");   
//		Matcher match = patron.matcher(correo);   
//		return match.matches();
//	}
//	
//	public boolean validarDireccion(String direccion){
//		Pattern patron = Pattern.compile("^[a-zA-Z ]*$");
//		Matcher match = patron.matcher(direccion);
//		return match.matches();
//	}
//	
//	public boolean validarCiudad(String ciudad){
//		Pattern patron = Pattern.compile("^[a-zA-Z ]*$");
//		Matcher match = patron.matcher(ciudad);
//		return match.matches();
//	}
//	
//	public boolean validarEstado(String estado){
//		Pattern patron = Pattern.compile("^[a-zA-Z ]*$");
//		Matcher match = patron.matcher(estado);
//		return match.matches();
//	}
//	
//	public boolean validarPais(String pais){
//		Pattern patron = Pattern.compile("^[a-zA-Z ]*$");
//		Matcher match = patron.matcher(pais);
//		return match.matches();
//	}
//	
//	public boolean validarFecha(String fecha){
//		Pattern patron = Pattern.compile("(\\d{2})-(\\d{2})-(\\d{4})");
//		Matcher match = patron.matcher(fecha);
//		return match.matches();
//	}
//	
//	public boolean validarIdentificacion(String identificacion){
//		Pattern patron = Pattern.compile("^[0-9]*$");
//		Matcher match = patron.matcher(identificacion);
//		return match.matches();
//	}
		
}